'use strict';

module.exports = () => {
  return async function errorHandler(ctx, next) {
    try {
      await next();
    } catch (err) {
      // 所有的异常都在 app 上触发一个 error 事件，框架会记录一条错误日志
      ctx.app.emit('error', err, ctx);

      const status = err.status || 500;
      const error = status === 500 && ctx.app.config.env === 'prod' ?
        'Internal Server Error' :
        err.message;

      // 设置 HTTP 状态码为 200
      ctx.status = 200;

      // 对于验证错误，添加详细信息
      if (status === 422) {
        ctx.body = {
          code: status,
          message: error,
          data: err.errors
        };
      } else {
        ctx.body = {
          code: status,
          message: error,
          data: null
        };
      }
    }
  };
};